package com.gq.rising.core;

import com.gq.rising.common.*;
import org.springframework.beans.factory.annotation.Autowired;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.HashMap;
import java.util.Map;


/**
 * @Description: 初始化程序界面
 * @Author: GQ
 */
public class InitiFace {

    @Autowired
    private DbSource dbSource;

    private static Map<String, Object> inputBoxValue = new HashMap<>();

    //初始化程序界面
    public void init(){
        try {
            JFrame jf = new JFrame(Cons.JF_TITLE);
            jf.setSize(750, 450);
            jf.setLocationRelativeTo(null);
            // 窗口关闭监听  使用frame.dispose()只会关闭swing
            jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            // 创建内容面板，指定布局为 null，则使用绝对布局
            JPanel panel = new JPanel(null);

            //创建Source文字标签
            Font font = new Font(null, Font.PLAIN, 20);// 设置字体，null 表示使用默认字体
            FontsCreate sourceLabel = new FontsCreate("Source：",font,40, 15, 120, 50);
            panel.add(sourceLabel);
            //创建Host文字标签
            FontsCreate hostLabel = new FontsCreate("Host：",font,40,55,100,50);
            panel.add(hostLabel);
            //创建port文字标签
            FontsCreate portLabel = new FontsCreate("Port：",font,320,55,100,50);
            panel.add(portLabel);
            //创建User文字标签
            FontsCreate userLabel = new FontsCreate("User：",font,40, 95, 100, 50);
            panel.add(userLabel);
            //创建PassWord文字标签
            FontsCreate pwLabel = new FontsCreate("PassWord：",font,40, 135, 120, 50);
            panel.add(pwLabel);


            // 创建文本框Host
            TextBoxCreate boxHost = new TextBoxCreate(font,150, 65, 170, 30);
            addDocumentListener(boxHost,"boxHost");
            boxHost.setVisible(true);
            panel.add(boxHost);
            // 创建文本框Port
            TextBoxCreate port = new TextBoxCreate(font,430, 65, 170, 30);
            addDocumentListener(port,"port");
            port.setVisible(true);
            panel.add(port);
            // 创建文本框User
            TextBoxCreate userName = new TextBoxCreate(font,150, 105, 450, 30);
            addDocumentListener(userName,"userName");
            userName.setVisible(true);
            panel.add(userName);
            // 创建文本框PassWord
            TextBoxCreate pwWord = new TextBoxCreate(font,150, 145, 450, 30);
            addDocumentListener(pwWord,"pwWord");
            pwWord.setVisible(true);
            panel.add(pwWord);

            // 创建一个下拉列表框用于选择数据源
            JComboBox<String> chooseBox = new JComboBox<String>(Cons.DATA_SOURCE);
            chooseBox.setBounds(150, 25, 450, 30);
            // 监听条目改变
            chooseBox.addItemListener(new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {

                    //清空其他输入框内容
                    clearInputBox();
                    //数据源model连接成功标志置0
                    dbSource.setConnectSuccessFlag(0);

                    // 只处理选中的状态
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        String selectedItem = (String) chooseBox.getSelectedItem();
                        if ("Oracle".equals(selectedItem)){
                            dbSource.setName("Oracle");//数据库类型
                            dbSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");//驱动
                        }else if ("MySql".equals(selectedItem)){
                            dbSource.setName("MySql");
                            dbSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
                        }else {
                            //TODO 预留开发其它数据库文档支持
                        }
                        dbSource.setUrl(boxHost.getText());
                        dbSource.setPort(port.getText());
                        dbSource.setUsername(userName.getText());
                        dbSource.setPassword(pwWord.getText());
                    }
                }

                //主机、端口、用户名与密码输入框置空
                private void clearInputBox() {
                    boxHost.setText("");
                    port.setText("");
                    userName.setText("");
                    pwWord.setText("");
                }
            });
            // 设置默认选中的条目
            chooseBox.setSelectedIndex(0);
            // 添加到内容面板
            panel.add(chooseBox);


            // 创建Connection按钮 TODO 用户测试数据库是否连接成功
            ButtonCreate conButton = new ButtonCreate("Connection", 620, 25, 100, 30);
            conButton.connection(dbSource,inputBoxValue);// 连接数据库
            panel.add(conButton);

            // 创建About按钮 TODO 介绍一些软件信息
            ButtonCreate aboutButton = new ButtonCreate("About", 25, 350, 100, 30);
            aboutButton.popupAbout();//弹出窗口
            panel.add(aboutButton);

            // 创建Exit按钮 TODO 退出软件
            ButtonCreate exitButton = new ButtonCreate("Exit", 630, 350, 100, 30);
            exitButton.exit();// 关闭窗口
            panel.add(exitButton);

            // 创建Invoke按钮 TODO 执行生成数据库文档功能
            ButtonCreate invokeButton = new ButtonCreate("Invoke", 430, 350, 100, 30);
            invokeButton.invoke(inputBoxValue);
            panel.add(invokeButton);

            // 显示窗口
            jf.setContentPane(panel);
            jf.setVisible(true);
            // 窗口大小不可改变
            jf.setResizable(false);
        } catch (HeadlessException e) {
            e.printStackTrace();
        }

    }


    /**
     * 添加文本框内的 文本改变 监听器
     * 参数说明：JTextField对象、对应文本框的唯一表示key
     * @return
     */
    public static void addDocumentListener(TextBoxCreate textBoxCreate, String key){
        textBoxCreate.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                inputBoxValue.put(key,textBoxCreate.getText());
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                inputBoxValue.put(key,textBoxCreate.getText());
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                inputBoxValue.put(key,textBoxCreate.getText());
            }
        });
    }

}
